package org.resthub.jpa; import com.zaxxer.hikari.HikariCPTestDataSource; import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.TestElf; import org.fest.assertions.api.Assertions; import org.h2.jdbcx.JdbcDataSource; import org.resthub.jpa.pool.HikariCPDataSourceFactory; import org.resthub.jpa.sql.FakeDataSource; import org.testng.annotations.Test; import javax.sql.DataSource; import java.lang.reflect.Field; import java.sql.Connection; import java.util.Properties; public class HikariCPDataSourceFactoryTest { private HikariCPDataSourceFactory hikariCPDataSourceFactory = new HikariCPDataSourceFactory(); @Test public void testHikariDataSourceConfigNoProps() throws Exception { Properties configProps = new Properties(); configProps.put("dataSourceClassName", "org.resthub.jpa.sql.FakeDataSource"); DataSource dataSource = hikariCPDataSourceFactory.create(HikariCPTestDataSource.class, configProps); Assertions.assertThat(dataSource).isNotNull().isInstanceOf(HikariCPTestDataSource.class); HikariCPTestDataSource testDataSource = (HikariCPTestDataSource) dataSource; Assertions.assertThat(testDataSource).isNotNull(); Assertions.assertThat(testDataSource.getConfig()).isNotNull(); // check that Hikari defaults are kept HikariConfig expectedDefaults = new HikariConfig(); Assertions.assertThat(testDataSource.getConfig().getConnectionCustomizerClassName()).isEqualTo(expectedDefaults.getConnectionCustomizerClassName()); Assertions.assertThat(testDataSource.getConfig().getConnectionInitSql()).isEqualTo(expectedDefaults.getConnectionInitSql()); Assertions.assertThat(testDataSource.getConfig().getConnectionTestQuery()).isEqualTo(expectedDefaults.getConnectionTestQuery()); Assertions.assertThat(testDataSource.getConfig().getConnectionTimeout()).isEqualTo(expectedDefaults.getConnectionTimeout()); Assertions.assertThat(testDataSource.getConfig().getDataSourceClassName()).isEqualTo((String)configProps.get("dataSourceClassName")); Assertions.assertThat(testDataSource.getConfig().getDataSource()).isEqualTo(expectedDefaults.getDataSource()); Assertions.assertThat(testDataSource.getConfig().getIdleTimeout()).isEqualTo(expectedDefaults.getIdleTimeout()); Assertions.assertThat(testDataSource.getConfig().getLeakDetectionThreshold()).isEqualTo(expectedDefaults.getLeakDetectionThreshold()); Assertions.assertThat(testDataSource.getConfig().getMaximumPoolSize()).isEqualTo(expectedDefaults.getMaximumPoolSize()); Assertions.assertThat(testDataSource.getConfig().getMaxLifetime()).isEqualTo(expectedDefaults.getMaxLifetime()); Assertions.assertThat(testDataSource.getConfig().getPoolName()).startsWith("HikariPool-"); Assertions.assertThat(testDataSource.getConfig().getTransactionIsolation()).isEqualTo(expectedDefaults.getTransactionIsolation()); Assertions.assertThat(testDataSource.getConfig().isAutoCommit()).isEqualTo(expectedDefaults.isAutoCommit()); Assertions.assertThat(testDataSource.getConfig().isJdbc4ConnectionTest()).isEqualTo(expectedDefaults.isJdbc4ConnectionTest()); Assertions.assertThat(testDataSource.getConfig().isInitializationFailFast()).isEqualTo(expectedDefaults.isInitializationFailFast()); Assertions.assertThat(testDataSource.getConfig().isRegisterMbeans()).isEqualTo(expectedDefaults.isRegisterMbeans()); // check concrete datasource parameters Assertions.assertThat(testDataSource.isWrapperFor(FakeDataSource.class)).isTrue(); } @Test public void testHikariDataSourceConfigAllProps() throws Exception { Properties configProps = new Properties(); configProps.put("dataSourceClassName", "org.resthub.jpa.sql.FakeDataSource"); configProps.put("dataSource.url", "jdbc:h2:mem:resthub"); configProps.put("dataSource.user", "sa"); configProps.put("dataSource.password", ""); configProps.put("connectionCustomizerClassName", "com.zaxxer.hikari.TestConnectionCustomization"); configProps.put("connectionInitSql", "select 1"); configProps.put("connectionTestQuery", "select 1"); configProps.put("connectionTimeout", 1000L); configProps.put("dataSourceClassName", "org.resthub.jpa.sql.FakeDataSource"); configProps.put("idleTimeout", 60000L); configProps.put("leakDetectionThreshold", 100000L); configProps.put("minimumIdle", 2); configProps.put("maximumPoolSize", 10); configProps.put("maxLifetime", 200000L); configProps.put("poolName", "testPoolName"); configProps.put("transactionIsolation", "TRANSACTION_READ_COMMITTED"); configProps.put("autoCommit", false); configProps.put("jdbc4ConnectionTest", false); configProps.put("initializationFailFast", true); configProps.put("registerMbeans", true); DataSource dataSource = hikariCPDataSourceFactory.create(HikariCPTestDataSource.class, configProps); Assertions.assertThat(dataSource).isNotNull().isInstanceOf(HikariCPTestDataSource.class); HikariCPTestDataSource testDataSource = (HikariCPTestDataSource) dataSource; Assertions.assertThat(testDataSource).isNotNull(); Assertions.assertThat(testDataSource.getConfig()).isNotNull(); Assertions.assertThat(testDataSource.getConfig().getConnectionCustomizerClassName()).isEqualTo((String) configProps.get("connectionCustomizerClassName")); Assertions.assertThat(testDataSource.getConfig().getConnectionInitSql()).isEqualTo((String) configProps.get("connectionInitSql")); Assertions.assertThat(testDataSource.getConfig().getConnectionTestQuery()).isEqualTo((String) configProps.get("connectionTestQuery")); Assertions.assertThat(testDataSource.getConfig().getConnectionTimeout()).isEqualTo((Long) configProps.get("connectionTimeout")); Assertions.assertThat(testDataSource.getConfig().getDataSourceClassName()).isEqualTo((String) configProps.get("dataSourceClassName")); Assertions.assertThat(testDataSource.getConfig().getIdleTimeout()).isEqualTo((Long) configProps.get("idleTimeout")); Assertions.assertThat(testDataSource.getConfig().getLeakDetectionThreshold()).isEqualTo((Long) configProps.get("leakDetectionThreshold")); Assertions.assertThat(testDataSource.getConfig().getMaximumPoolSize()).isEqualTo((Integer) configProps.get("maximumPoolSize")); Assertions.assertThat(testDataSource.getConfig().getMaxLifetime()).isEqualTo((Long) configProps.get("maxLifetime")); Assertions.assertThat(testDataSource.getConfig().getPoolName()).isEqualTo((String) configProps.get("poolName")); Field field = Connection.class.getField((String) configProps.get("transactionIsolation")); int level = field.getInt(null); Assertions.assertThat(testDataSource.getConfig().getTransactionIsolation()).isEqualTo(level); Assertions.assertThat(testDataSource.getConfig().isAutoCommit()).isEqualTo((Boolean) configProps.get("autoCommit")); Assertions.assertThat(testDataSource.getConfig().isJdbc4ConnectionTest()).isEqualTo((Boolean) configProps.get("jdbc4ConnectionTest")); Assertions.assertThat(testDataSource.getConfig().isInitializationFailFast()).isEqualTo((Boolean) configProps.get("initializationFailFast")); Assertions.assertThat(testDataSource.getConfig().isRegisterMbeans()).isEqualTo((Boolean) configProps.get("registerMbeans")); // check concrete datasource parameters Assertions.assertThat(testDataSource.isWrapperFor(FakeDataSource.class)).isTrue(); JdbcDataSource ds = (JdbcDataSource) TestElf.getPool(testDataSource).getDataSource(); Assertions.assertThat(ds.getURL()).isNotNull().isEqualTo((String) configProps.get("dataSource.url")); Assertions.assertThat(ds.getUser()).isNotNull().isEqualTo((String) configProps.get("dataSource.user")); Assertions.assertThat(ds.getPassword()).isNotNull().isEqualTo((String) configProps.get("dataSource.password")); } @Test public void testHikariDataSourceConfigPartialAnUnresolvedProps() throws Exception { Properties configProps = new Properties(); configProps.put("dataSourceClassName", "org.resthub.jpa.sql.FakeDataSource"); configProps.put("dataSource.url", "jdbc:h2:mem:resthub"); configProps.put("dataSource.user", "sa"); configProps.put("dataSource.password", ""); configProps.put("poolName", "testPoolName"); configProps.put("maximumPoolSize", "${maximumPoolSize}"); configProps.put("registerMbeans", "${registerMbeans}"); configProps.put("idleTimeout", "${idleTimeout}"); DataSource dataSource = hikariCPDataSourceFactory.create(HikariCPTestDataSource.class, configProps); Assertions.assertThat(dataSource).isNotNull().isInstanceOf(HikariCPTestDataSource.class); HikariCPTestDataSource testDataSource = (HikariCPTestDataSource) dataSource; Assertions.assertThat(testDataSource).isNotNull(); Assertions.assertThat(testDataSource.getConfig()).isNotNull(); // check that Hikari defaults are kept HikariConfig expectedDefaults = new HikariConfig(); Assertions.assertThat(testDataSource.getConfig().getConnectionCustomizerClassName()).isEqualTo(expectedDefaults.getConnectionCustomizerClassName()); Assertions.assertThat(testDataSource.getConfig().getConnectionInitSql()).isEqualTo(expectedDefaults.getConnectionInitSql()); Assertions.assertThat(testDataSource.getConfig().getConnectionTestQuery()).isEqualTo(expectedDefaults.getConnectionTestQuery()); Assertions.assertThat(testDataSource.getConfig().getConnectionTimeout()).isEqualTo(expectedDefaults.getConnectionTimeout()); Assertions.assertThat(testDataSource.getConfig().getDataSource()).isEqualTo(expectedDefaults.getDataSource()); Assertions.assertThat(testDataSource.getConfig().getIdleTimeout()).isEqualTo(expectedDefaults.getIdleTimeout()); Assertions.assertThat(testDataSource.getConfig().getLeakDetectionThreshold()).isEqualTo(expectedDefaults.getLeakDetectionThreshold()); Assertions.assertThat(testDataSource.getConfig().getMaximumPoolSize()).isEqualTo(expectedDefaults.getMaximumPoolSize()); Assertions.assertThat(testDataSource.getConfig().getMaxLifetime()).isEqualTo(expectedDefaults.getMaxLifetime()); Assertions.assertThat(testDataSource.getConfig().getTransactionIsolation()).isEqualTo(expectedDefaults.getTransactionIsolation()); Assertions.assertThat(testDataSource.getConfig().isAutoCommit()).isEqualTo(expectedDefaults.isAutoCommit()); Assertions.assertThat(testDataSource.getConfig().isJdbc4ConnectionTest()).isEqualTo(expectedDefaults.isJdbc4ConnectionTest()); Assertions.assertThat(testDataSource.getConfig().isInitializationFailFast()).isEqualTo(expectedDefaults.isInitializationFailFast()); Assertions.assertThat(testDataSource.getConfig().isRegisterMbeans()).isEqualTo(expectedDefaults.isRegisterMbeans()); // check concrete datasource parameters Assertions.assertThat(testDataSource.isWrapperFor(FakeDataSource.class)).isTrue(); JdbcDataSource ds = (JdbcDataSource) TestElf.getPool(testDataSource).getDataSource(); Assertions.assertThat(testDataSource.getConfig().getDataSourceClassName()).isEqualTo((String) configProps.get("dataSourceClassName")); Assertions.assertThat(testDataSource.getConfig().getPoolName()).isEqualTo((String) configProps.get("poolName")); Assertions.assertThat(ds.getURL()).isNotNull().isEqualTo((String) configProps.get("dataSource.url")); Assertions.assertThat(ds.getUser()).isNotNull().isEqualTo((String) configProps.get("dataSource.user")); Assertions.assertThat(ds.getPassword()).isNotNull().isEqualTo((String) configProps.get("dataSource.password")); } }